<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    var decodeString = function (s) {
      if (s.length === 0) return "";
      let res = "";
      let times = 0; // 用于记录当前的数字
      let numStack = [], // 记录出现过的数字
        strStack = []; // 记录出现过的字符
      for (let i = 0; i < s.length; i++) {
        let char = s[i];
        if (char >= "0" && char <= "9") {
          // 如果出现两位及以上数字字符，将其转化为正确的数字
          times = times * 10 + Number(char);
        } else if (char === "[") {
          // 遇到[字符时，将当前的数字和字符进行保存，分别存进对应的栈内
          // 然后重新计算出现的数字和字符
          numStack.push(times);
          strStack.push(res);
          times = 0;
          res = "";
        } else if (char === "]") {
          // 出现]字符时，计算满足[]条件的字符串
          // 首先取出numStack中保存的字符的出现次数
          // 然后按照出现次数对res进行累加
          let tmpTimes = numStack.pop();
          let tmpStr = res;
          for (let k = 1; k < tmpTimes; k++) {
            res += tmpStr;
          }
          // 最后取出上一层[]内的字符加到res前面
          res = strStack.pop() + res;

        } else {
          // 如果遇到的是字母字符，则更新当前的字符串
          res += char;
        }
      }
      return res;
    };
    console.log(decodeString(s = "3[a]2[bc]"))
  </script>
</body>

</html>